package copyengine.ui.component.scrollablePanel.element
{
    import copyengine.ui.component.scrollablePanel.scrollPanel.CEScrollPanel;
    import copyengine.utils.ICEDispose;

    import flash.geom.Rectangle;

    import starling.display.DisplayObject;
    import starling.display.DisplayObjectContainer;

    public interface ICEScrollableElement extends ICEDispose
    {
        /**
         * 当前Element在ScrollPanel内部的虚拟位置值,比如Element被setInScrollPanelPos(100,30)
         * 其自身宽高为300,和200 则最终Rect为 (100,30,300,200)
         */
        function getBounds():Rectangle;

        /**
         * 在Layout时候用该值进行排序
         * 比如 垂直的Layout,一个Element的Rank是10 另外一个是20 则第一个Element会排在第一位 第二个排在第二位
         * 注意! 每个Element之间是没有Gap间隔的,如果需要可以在Element返回Bounds时候添加
         */
        function get sortRank():int;

        function set sortRank(_rank:int):void;

        function show(_scrollPanelContainer:DisplayObjectContainer, _viewportRe:Rectangle):void;

        function hide():void;

        function set scrollPanel(_scrollPanel:CEScrollPanel):void;

        /**
         * 设置Element在ScrollPanel中的"坐标值"  注意Element本体并不是一个显示对象 其内部只是包含了一个显示对象
         * 这里设置的坐标 可以理解为虚拟坐标,比如设置坐标为(100,30) 及表示 在虚拟的ScrollPanel"显示对象"里面
         * 当前Element被放置在了100,30这个位置上.
         *
         * 当调用Element的show函数时候,会传入当前的Viewport视口范围,比如(80,20,300,300) 及视口当前坐标为(80,20)
         * 所以当前Element 真正被看到的时候坐标应该为(100-80,30-20)=>(20,10)
         * 也就是
         * scrollPanelContainer.addChild(elementContainer);
         * elementContainer.x = 20;
         * elementContainer.y = 10;
         *
         * @param _x
         * @param _y
         */
        function setInScrollPanelPos(_x:int, _y:int):void;

        /**
         * 将Element的显示对象暴露给外面,这样方便外部获得当前元素的显示对象 从而做一些特效
         * 比如: ScrollPanel刚刚加载时候然后让所有的Element飞入到应该到的位置
         *
         * 需要注意
         *
         * 1` 当Element没有显示在视口中时候 得到的Container viable=false或者没有挂载在stage上
         * @see CEScrollPanelElementBasic.isRemoveFromPanelDuringHide()
         *
         * 2` 当ScrollPanel为CEListElement时候 因为共享显示对象 所以不是所有的Element都含有container, 所以该方法会返回Null
         *
         */
        function get elementContainer():DisplayObject;

    }
}
